<?php
/**
 * Model de Projeto
 * @filesource  07/04/2011
 * @author      Estrada Virtual <http://estradavirtual.com.br>
 * @copyright   Copyright <2011> Estrada Virtual
 * @package     <<application>>
 * @subpackage  <<application>>.application.models
 * @version     $Id$
 */
class Model_Projeto extends App_Db_Table
{
    const SITUACAO_NAO_INICIADO = 'N';
    const SITUACAO_ABERTO       = 'A';
    const SITUACAO_FINALIZADO   = 'F';
    const SITUACAO_CONGELADO    = 'C';

    protected $_name             = 'projeto';
    protected $_primary          = array('id_projeto');
    protected $_dependentTables  = array('Model_Anotacao', 'Model_Artefato', 'Model_Tarefa');

    protected $_referenceMap     = array(
                    'ApoioSituacao' => array(
                            'columns'       => 'fk_apoio_situacao',
                            'refTableClass' => 'Model_ApoioSituacao',
                            'refColumns'    => 'id_apoio_situacao',
                         ),
                    'Cliente' => array(
                            'columns'       => 'fk_cliente',
                            'refTableClass' => 'Model_Cliente',
                            'refColumns'    => 'id_cliente',
                         ),
                    'TipoProjeto' => array(
                            'columns'       => 'fk_tipo_projeto',
                            'refTableClass' => 'Model_TipoProjeto',
                            'refColumns'    => 'id_tipo_projeto',
                         ));

    public function getSituacoes()
    {
        return array(Model_Projeto::SITUACAO_ABERTO       => 'Aberta',
                     Model_Projeto::SITUACAO_NAO_INICIADO => 'Não iniciada',
                     Model_Projeto::SITUACAO_FINALIZADO   => 'Finalizada',
                     Model_Projeto::SITUACAO_CONGELADO    => 'Congelada'
                     );
    }

    public function getAgrupados($idUsuario = null)
    {
        $select = $this->getDefaultAdapter()->select()
                       ->from(array('p'=>'projeto'))
                       ->join(array('c'=>'cliente'), 'c.id_cliente = p.fk_cliente', array('cliente'=>'st_nome'))
                       ->where('fk_apoio_situacao != 6')
                       ->where('cs_situacao <> ?', self::SITUACAO_FINALIZADO)
                       ->order(array('c.st_nome', 'p.st_nome'));
        if ($idUsuario) {
            $select->join(array('pu' => 'projeto_usuario'), 'p.id_projeto = pu.fk_projeto')
                   ->where('pu.fk_usuario = ?', $idUsuario);
        }
        $rowSet = $select->query()->fetchAll();

        $arDados = array();
        foreach($rowSet as $row){
            $arDados[$row->fk_cliente . ' - ' . $row->cliente][] = $row;
        }

        return $arDados;
    }

    public function gerarTarefas($idProjeto)
    {
        $rowProjeto = $this->find($idProjeto)->current();

        // Recuperar processos já realizados ou iniciados
        $aProcessosRealizados = array();
        $rowSetProjetoProcessos = $rowProjeto->findModel_ProjetoProcesso();
        foreach ($rowSetProjetoProcessos as $rowProjetoProcesso) {
            $aProcessosRealizados[$rowProjetoProcesso->fk_processo] = $rowProjetoProcesso;
        }

        // Recupera todos os processos que o projeto deve ter
        $modelTipoProjeto = new Model_TipoProjeto();
        $aProcessos = $modelTipoProjeto->getProcessos($rowProjeto->fk_tipo_projeto);
        $boGerarTarefas = true;
        foreach ($aProcessos as $oProcesso) {
            // Verifica se já foi iniciado o processo
            if (empty($aProcessosRealizados[$oProcesso->id_processo])) {
                // Gera as tarefas
                if ($boGerarTarefas) {
                    return $this->iniciarProcesso($idProjeto, $oProcesso->id_processo);
                }
            } else {
                $rowProjetoProcesso = $aProcessosRealizados[$oProcesso->id_processo];
                if (empty($rowProjetoProcesso->dt_fim)) {
                    $boGerarTarefas = false;
                }
            }
        }

        return $boGerarTarefas;
    }

    public function finalizarProcesso($idProjeto, $fkProcesso)
    {
        $modelProjetoProcesso = new Model_ProjetoProcesso();
        $rowProcesso = $modelProjetoProcesso->find($idProjeto, $fkProcesso)->current();
        if ($rowProcesso->dt_fim) {
            return false;
        }
        $rowProcesso->dt_fim = date('Y-m-d H:i:s');
        $rowProcesso->save();
        $this->gerarTarefas($idProjeto);
    }

    public function iniciarProcesso($idProjeto, $fkProcesso)
    {
        $rowProjeto = $this->find($idProjeto)->current();

        $modelTarefaGuia = new Model_TarefaGuia();
        $modelTarefaGuia->gerarTarefasPorProcesso($fkProcesso, $rowProjeto);

        // Inseri novo relacionado de projeto com processo
        $aDadosProjetoProcesso['fk_processo'] = $fkProcesso;
        $aDadosProjetoProcesso['fk_projeto']  = $idProjeto;
        $aDadosProjetoProcesso['dt_inicio']   = date('d/m/Y H:i:s');
        $modelProjetoProcesso = new Model_ProjetoProcesso();
        $modelProjetoProcesso->gravar($aDadosProjetoProcesso);
    }

    public function somarHoras($id_projeto)
    {
        $db = Zend_Db_Table::getDefaultAdapter();
        $sql = 'select
                       SEC_TO_TIME(sum(TIME_TO_SEC(qt_horas))) as qt_horas
                from tarefa_atividade TA
                INNER JOIN tarefa T ON TA.fk_tarefa = T.id_tarefa
                WHERE T.fk_projeto = ' . $id_projeto;
        return $db->query($sql)->fetchObject()->qt_horas;
    }

    /**
     * Método chamado antes da salvar o registro, utilizado para validações de table
     * @param $oRow Zend_Db_Table_Row
     * @return unknown_type
     */
    public function _preSave($oRow, $mode)
    {
        parent::_preSave($oRow, $mode);
        if (!is_numeric($oRow->vl_valor)) {
            $oRow->vl_valor = str_replace(',', '.', str_replace('.', '', $oRow->vl_valor));
        }
        return $oRow;
    }
}
